package org.example.analysis.model.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.github.javaparser.ast.expr.AnnotationExpr;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Java类信息
 */
@Data
@Accessors(chain = true)
public class JavaClassInfo {
    /**
     * 主键ID
     */
    private Long id;
    
    /**
     * 项目名称
     */
    private String projectName;
    
    /**
     * 类名
     */
    private String className;
    
    /**
     * 包名
     */
    private String packageName;
    
    /**
     * 类注释
     */
    private String classComment;
    private String classDesc;
    /**
     * 完全限定名
     */
    private String fullQualifiedName;
    
    /**
     * 父类
     */
    private String superClass;
    
    /**
     * 是否是接口
     */
    private boolean isInterface;
    
    /**
     * 是否是抽象类
     */
    private boolean isAbstract;
    
    /**
     * 是否是内部类
     */
    private boolean isInnerClass;
    
    /**
     * 是否是测试类
     */
    private boolean isTestClass;
    
    /**
     * 代码行数
     */
    private int codeLines;
    
    /**
     * 类型（SERVICE-服务类, ENTITY-实体类, OTHER-其他）
     */
    private String classType;
    
    /**
     * 最后修改时间
     */
    private Date lastModifiedTime;
    
    /**
     * 最后修改人
     */
    private String lastModifiedBy;
    
    /**
     * 创建时间
     */
    private Date createdAt;
    
    /**
     * 是否可刷新
     */
    private Boolean refreshable = true;
    private Integer complexityScore=0;

    /**
     * 修饰符和注解列表
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> modifiers = new ArrayList<>();
    
    /**
     * 接口列表
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> interfaces = new ArrayList<>();
    
    /**
     * 注解列表
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> annotations = new ArrayList<>();
    
    /**
     * 字段列表
     */
    @TableField(exist = false)
    private List<JavaFieldInfo> fields = new ArrayList<>();
    
    /**
     * 方法列表
     */
    @TableField(exist = false)
    private List<JavaMethodInfo> methods = new ArrayList<>();

    /**
     * 判断是否是测试类
     */
    public boolean isTestClass() {
        // 检查类名是否包含Test
        if (className != null && (className.endsWith("Test") || className.endsWith("Tests"))) {
            return true;
        }
        // 检查是否有测试相关注解
        if (annotations != null) {
            for (String annotation : annotations) {
                if (annotation.contains("Test") || annotation.contains("RunWith")) {
                    return true;
                }
            }
        }
        return false;
    }
    
    /**
     * 判断是否是内部类
     */
    public boolean isInnerClass() {
        return className != null && className.contains("$");
    }
    
    /**
     * 获取方法列表
     */
    public List<JavaMethodInfo> getMethods() {
        return methods;
    }
    
    /**
     * 设置方法列表
     */
    public void setMethods(List<JavaMethodInfo> methods) {
        this.methods = methods;
    }
} 